<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>js创建类的方法</title>
</head>
<body>


    <script>
        // 1.工厂方式
        function createObj1() {
            var obj = new Object();//或者 var obj = {};
            obj.name = "steve";
            obj.age = 16;
            obj.classRoom = 105210440006;
            obj.sayName = function () {
                console.log(obj.name);
            };
            return obj;
        }
            //调用工厂方法
        var obj1 = createObj1();
        console.log(obj1);
        console.log("姓名:"+obj1.name,"年龄:"+obj1.age,"班级:"+obj1.classRoom);
        obj1.sayName();
        //这种创建方式的问题是：每次创建的一个新对象的时候，这个对象的属性和方法都需要重新创建一次，浪费内存
    </script>


    <script>
        //2.构造器方式
        //创建一个构造器，构造函数首字母大写
        function CreateObj2(){
            this.name = "steve";
            this.age = 16;
            this.classRoom = 105210440006;
            this.sayName = function () {
                console.log("steve");
            }
        }
        //利用构造器，使用new 关键字生成对象
        var obj2 = new CreateObj2();
        console.log(obj2);
        console.log(obj2.name);
        console.log(obj2.age);
        obj2.sayName();

        //问题：这是最基本的方式，但也存在和工厂方式同样的问题
    </script>


    <script>
        //3.原型方式
        function createObj3(){

        }
        createObj3.prototype.name="steve";
        createObj3.prototype.sayName=function () {
            console.log();
        }
        var obj3=new createObj3();
        console.log(obj3);
        console.log(obj3.name);
        //这个方式的缺点是，当有引用属性时，改变一个对象的这个属性也会改变其他对象的这个属性。因为一个引用属性，都是指向的同一个地方。
    </script>

    <script>
        //4.原型/构造联合方式
            //用构造函数定义对象的非函数属性
        function  CreateObj4(name) {
            this.name = name;
            this.array=new Array("A","B","C")
        }
            //用原型方式定义对象的方法
        CreateObj4.prototype.sayName=function () {
            console.log("steve");
        }
        var obj4 = new CreateObj4("steve");
        console.log(obj4.name);
        obj4.sayName();
    </script>


    <script>
        //5.动态原型方式
        function  Person(name,age) {
            this.name=name;
            this.age=age;
            if(typeof this.sayName!="function"){
                Person.prototype.sayName=function () {
                    console.log(this.name);
                }
            }
        }
        var obj5=new Person("steve",16);
        console.log(obj5);
    </script>






</body>
</html>